#include "common.hpp"
#include "log.hpp"

using namespace std;

// 管理管道文件
int main()
{
    Init init; // 创建管道与删除封装起来，让进程只有通信的代码;直接ctrl+c掉进程，不会调用析构

    Log log;//调用构造默认是往显示打印

    log.Enable(Onefile);//指定是往一个文件打印

    //log.Enable(Classfile);//指定是往多个文件去打印,进不同等级的日志文件分类

    // 打开管道
    int fd = open(FIFO_FILE, O_RDONLY); // 等待写方打开文件之后，自己才会打开文件，向后执行代码，所以写方没有打开文件open会阻塞
    if (fd < 0)
    {
        log(Fatal, "error string: %s, error code: %d", strerror(errno), errno);
        // perror("open");
        exit(FIFO_OPEN_ERR);
    }

    // cout << "server open file done" << endl;

    //实际调用operator(),log.operator()()
    log(Info, "server open file done, error string: %s, error code: %d", strerror(errno), errno);
    log(Warning, "server open file done, error string: %s, error code: %d", strerror(errno), errno);
    log(Fatal, "server open file done, error string: %s, error code: %d", strerror(errno), errno);
    log(Debug, "server open file done, error string: %s, error code: %d", strerror(errno), errno);

    // 开始通信
    while (true)
    {
        char buffer[1024] = {0};
        int x = read(fd, buffer, sizeof(buffer));
        if (x > 0)
        {
            buffer[x] = 0; // 读到的系统文件是没有字符0的概念的，所以加一个，方便打印字符串
            cout << "client say# " << buffer << endl;
        }
        else if (x == 0) // 写端关闭，read返回0，读端也停下
        {
            // cout << "client quit,me too!\n"<< endl;
            log(Debug, "client quit, me too!, error string: %s, error code: %d", strerror(errno), errno);
            break;
        }
        else
            break;
    }

    close(fd);

    return 0;
}